package com.gf.gf_data.util;

import org.apache.shiro.crypto.RandomNumberGenerator;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;

/**
 * 创建用户密码加密工具类
 */
public class PasswordHelperUtil {

    private static final String algorithmName = "md5";
    private static final Integer hashIterations = 2;

    /**
     * 该正则必须符合以下条例：
     * 1、不能是纯数字
     * 2、不能是纯字母
     * 3、不能是纯特殊符号
     * 4、必须是字母或数字或指定特殊符号        !@#$%^&*
     * 5、必须是字母开头
     * 6、长度必须是8-16位（包括8，包括16）
     */
    public static String MATCHER = "^[A-Za-z](?![a-zA-Z]+$)[0-9A-Za-z!@#$%^&*]{7,15}$";

    /**
     * 支付密码校验
     * 长度：6
     * 类型：纯数字
     */
    public static String PAY_PWD_MATCHER = "[0-9]{6}";


    /**
     * 返回一个随机的salt
     *
     * @return
     */
    public static String getSalt() {
        RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
        return randomNumberGenerator.nextBytes().toHex();
    }

    /**
     * 传入salt、明文密码  ==》  返回明文密码根据salt加密过后的密文
     *
     * @param salt
     * @param password
     * @return
     */
    public static String getEncryptPassword(String salt, String password) {
        return new SimpleHash(
                algorithmName,
                password,
                ByteSource.Util.bytes(salt),
                hashIterations).toHex();
    }

    /**
     * 修改特定密码（测试阶段使用，上线请删除）
     *
     * @param args
     */
    public static void main(String args[]) {
        String pwd;
        pwd = getEncryptPassword("1f613181bf1b629cba0fc663f6c9b007", "1");
        pwd = getEncryptPassword("1f613181bf1b629cba0fc663f6c9b007", pwd);
        System.out.println("pwd = " + pwd);
    }

    /**
     * 校验支付密码是否正确
     *
     * @param salt
     * @param pwd
     * @param inputPwd
     * @return
     */
    public static boolean validatePwd(String salt, String pwd, String inputPwd) {
        if (inputPwd != null && salt != null) {
            inputPwd = new SimpleHash(algorithmName, inputPwd, ByteSource.Util.bytes(salt), hashIterations).toHex();
        }
        return pwd != null && pwd.equals(inputPwd);
    }

}
